 /*******************************************************************************
  * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.intro.impl.swt;

 import java.io.InputStream ;
 import java.net.URL ;
 import java.util.Properties ;

 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.RGB;
 import org.eclipse.ui.forms.FormColors;
 import org.eclipse.ui.forms.widgets.FormToolkit;
 import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot;
 import org.eclipse.ui.internal.intro.impl.util.ImageUtil;
 import org.eclipse.ui.internal.intro.impl.util.Log;
 import org.osgi.framework.Bundle;

 public class SharedStyleManager {

     protected Properties properties;
     protected StyleContext context;
     
     class StyleContext {
         IPath path;
         Bundle bundle;
         boolean inTheme;
     }

     SharedStyleManager() {
         // no-op
 }

     /**
      * Constructor used when shared styles need to be loaded. The bundle is
      * retrieved from the model root.
      *
      * @param modelRoot
      */
     public SharedStyleManager(IntroModelRoot modelRoot) {
         context = new StyleContext();
         context.bundle = modelRoot.getBundle();
         properties = new Properties ();
         String [] sharedStyles = modelRoot.getPresentation()
             .getImplementationStyles();
         if (sharedStyles != null) {
             for (int i=0; i<sharedStyles.length; i++)
             load(properties, sharedStyles[i], context);
         }
     }

     protected void load(Properties properties, String style, StyleContext context) {
         if (style == null)
             return;
         try {
             URL styleURL = new URL (style);
             InputStream is = styleURL.openStream();
             properties.load(is);
             is.close();
             context.path = new Path(style).removeLastSegments(1);
             String t = (String )properties.get("theme"); //$NON-NLS-1$
 if (t!=null && t.trim().equalsIgnoreCase("true")) //$NON-NLS-1$
 context.inTheme = true;
         } catch (Exception e) {
             Log.error("Could not load SWT style: " + style, e); //$NON-NLS-1$
 }
     }


     /**
      * Get the property from the shared properties.
      *
      * @param key
      * @return
      */
     public String getProperty(String key) {
         return doGetProperty(properties, key);
     }

     /*
      * Utility method to trim properties retrieval.
      */
     protected String doGetProperty(Properties aProperties, String key) {
         String value = aProperties.getProperty(key);
         if (value != null)
             // trim the properties as trailing balnnks cause problems.
 value = value.trim();
         return value;
     }


     protected RGB getRGB(String key) {
         String value = getProperty(key);
         if (value == null)
             return null;
         return parseRGB(value);
     }

     /**
      * A utility method that creates RGB object from a value encoded in the
      * following format: #rrggbb, where r, g and b are hex color values in the
      * range from 00 to ff.
      *
      * @param value
      * @return
      */

     public static RGB parseRGB(String value) {
         if (value.charAt(0) == '#') {
             // HEX
 try {
                 int r = Integer.parseInt(value.substring(1, 3), 16);
                 int g = Integer.parseInt(value.substring(3, 5), 16);
                 int b = Integer.parseInt(value.substring(5, 7), 16);
                 return new RGB(r, g, b);
             } catch (NumberFormatException e) {
                 Log.error("Failed to parser: " + value + " as an integer", e); //$NON-NLS-1$ //$NON-NLS-2$
 }
         }
         return null;
     }



     /**
      * Finds the bundle from which this key was loaded. This is the bundle from
      * which shared styles where loaded.
      *
      * @param key
      * @return
      */
     protected Bundle getAssociatedBundle(String key) {
         return context.bundle;
     }
     
     protected StyleContext getAssociatedContext(String key) {
         return context;
     }



     /**
      * @return Returns the properties.
      */
     public Properties getProperties() {
         return properties;
     }


     /**
      *
      *
      * @param toolkit
      * @param key
      * @return color. May return null.
      */
     public Color getColor(FormToolkit toolkit, String key) {
         FormColors colors = toolkit.getColors();
         Color color = colors.getColor(key);
         if (color == null) {
             RGB rgb = getRGB(key);
             if (rgb != null)
                 color = colors.createColor(key, rgb);
         }
         return color;
     }



     /**
      * Retrieve an image from this page's properties, given a key.
      *
      * @param key
      * @param defaultPageKey
      * @param defaultKey
      * @return
      */
     public Image getImage(String key, String defaultPageKey, String defaultKey) {
         String currentKey = key;
         String value = getProperty(currentKey);
         if (value == null && defaultPageKey != null) {
             currentKey = defaultPageKey;
             value = getProperty(defaultPageKey);
         }
         if (value != null) {
             if (ImageUtil.hasImage(currentKey))
                 return ImageUtil.getImage(currentKey);
             // try to register the image.
 StyleContext ccontext = getAssociatedContext(currentKey);
             if (ccontext.inTheme) {
                 // if 'theme' key is set, load image
 // relative to the file, not relative to the bundle
 ImageUtil.registerImage(currentKey, ccontext.path, value);
             }
             else {
                 Bundle bundle = ccontext.bundle;
                 if (bundle == null)
                     // it means that we are getting a key defined in this page's
 // styles. (ie: not an inherited style).
 bundle = this.context.bundle;
                 ImageUtil.registerImage(currentKey, bundle, value);
             }
             Image image = ImageUtil.getImage(currentKey);
             if (image != null)
                 return image;
         }
         // try default. We know default is already registered,
 if (defaultKey != null)
             return ImageUtil.getImage(defaultKey);
         return null;
     }


     public boolean useCustomHomePagelayout() {
         String key = "home-page-custom-layout"; //$NON-NLS-1$
 String value = getProperty(key);
         if (value == null)
             value = "true"; //$NON-NLS-1$
 return value.equalsIgnoreCase("true"); //$NON-NLS-1$
 }

 }

